SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS OFF
GO
--05/02/07   --   Debe liquidar solo los servicios en los que no exista para el servicio una relacion Extraordinaria y que el extrasistema continue.

CREATE PROCEDURE [dbo].[LIQProporcionalVacacionesNoGozadas]
	@CabeceraDeLiquidacion INT,
	@IdLiquidacionActual INT,
	@ConceptoATotalizar INT,
	@EsSuplente BIT 
 AS
SET NOCOUNT ON
PRINT 'Comienzo Liquidacion Proporcional vacaciones'

DECLARE @MesTitulares INT
DECLARE @AnioTitulares INT
DECLARE @AgenteV INT 
DECLARE @ServicioV INT 
DECLARE @FechaAltaV DATETIME
DECLARE @FechaBajaV DATETIME
DECLARE @SituacionRevistaV INT
DECLARE @OrganizacionV INT 
DECLARE @PlazaV INT
DECLARE @OrganizacionALiquidar INT 
DECLARE @TotalVacacionesNoGozadas DECIMAL(18,4)
DECLARE @NroError INT
DECLARE @Afiliacion INT
DECLARE @Horas INT
DECLARE @SubOrganizacion INT
DECLARE @DiasALiquidar INT 
DECLARE @Hasta DATETIME
DECLARE @UltimoSueldo DECIMAL(18,4)
DECLARE @HorasInformadas INT 
DECLARE @FechaHastaDeAntiguedad DATETIME
DECLARE @HorasDelSistema INT 
DECLARE @Anios INT 
DECLARE @DiasVacaciones INT 


SELECT @MesTitulares=MONTH(Desde), @AnioTitulares=YEAR(Desde), @Hasta = Hasta
	 FROM Tb_CabeceraDeLiquidacion
	 WHERE IdCabeceraDeLiquidacion = @CabeceraDeLiquidacion

SELECT @OrganizacionALiquidar=Organizacion FROM Tb_Liquidaciones WHERE IdLiquidacion=@IdLiquidacionActual 

--------- Concepto solo para Agentes Titulares 
--------- Armar Cursor con Servicios/Agentes para pago de Vacaciones No Gozadas

DECLARE ServiciosConVacaciones CURSOR FOR 

SELECT S.Agente, S.IdServicioAgente, S.FechaAlta, S.FechaBaja, S.SituacionRevista, S.UbicacionOrig, SS.Plaza
	FROM Tb_ServiciosAgentes S 
	INNER JOIN Tb_Agentes Ag ON Ag.IdAgente = S.Agente
	INNER JOIN Tb_SubServiciosAgentes SS ON SS.ServicioAgente = S.IdServicioAgente
	WHERE YEAR(S.FechaBaja)>=(@AnioTitulares-1)  -- PARA DICIEMBRE ESTO NO FUNCIONA!!!!!
	  AND S.UbicacionOrig=@OrganizacionALiquidar
	  AND S.SituacionRevista = 1 
	  AND S.FechaBaja = SS.FechaBaja
			--Que no tenga servicio activo
	  AND NOT EXISTS(SELECT S2.Agente FROM Tb_ServiciosAgentes S2 WHERE S2.Agente=S.Agente AND S2.FechaBaja IS NULL)	  
			--Que ya no se le haya liquidado el concepto 
	  AND NOT EXISTS(SELECT RL.Concepto FROM Tb_RegistrodeLiquidaciones RL INNER JOIN Tb_Liquidaciones Liq ON Liq.IdLiquidacion = RL.Liquidacion WHERE Liq.Tipo=4 AND RL.Servicio=S.IdServicioAgente AND RL.Concepto=@ConceptoATotalizar)
	  -- Que no exista para el servicio una relacion Extraordinaria y que el extrasistema continue. O dicho en otras palabras que no sea un servicio de Base.
	  AND NOT EXISTS(SELECT IdServicio FROM tb_RelInterServicios RI INNER JOIN tb_ServiciosAgentes SE ON RI.IdServicio = SE.IdServicioAgente AND TipoRelacion = 8 WHERE IdServicio2 = S.IdServicioAgente)

--	WHERE YEAR(S.FechaBaja)>=2005 AND  YEAR(S.FechaBaja)<= @AnioTitulares
--	INNER JOIN Tb_Organizaciones Org  ON Org.IdOrganizaciones = S.UbicacionOrig
--	   AND Org.EsPrivada = 'S'

PRINT 'Termino de Armar Cursor para Proporcional '

OPEN ServiciosConVacaciones
FETCH NEXT FROM ServiciosConVacaciones INTO @AgenteV, @ServicioV, @FechaAltaV, @FechaBajaV, @SituacionRevistaV, @OrganizacionV, @PlazaV
   WHILE @@FETCH_STATUS = 0
	BEGIN
		----- Inicializar
		SELECT @TotalVacacionesNoGozadas=0.0

		----- Liquidar el Concepto - Desarrollo

		----- Busca Ultimo Sueldo
		SELECT @UltimoSueldo = R.MontoHaberes - ISNULL(R2.MontoHaberes,0) FROM Tb_RegistrodeLiquidaciones R
			INNER JOIN Tb_Liquidaciones ON IdLiquidacion = R.Liquidacion
			LEFT OUTER JOIN Tb_RegistroDeLiquidaciones R2 ON R2.Liquidacion = R.Liquidacion AND R2.Concepto=32 AND R2.Servicio=R.Servicio
			WHERE R.Servicio=@ServicioV
			  AND R.Concepto=16 
			  AND Mes = MONTH(@FechaBajaV)
			  AND Anio = YEAR(@FechaBajaV)


		IF @UltimoSueldo IS NULL
			SELECT @UltimoSueldo=0

		---- Dias de Licencia segun Antiguedad
		SELECT @HorasInformadas = 0, @FechaHastaDeAntiguedad = NULL, @HorasDelSistema = 0 
		-- Si existe registro de Antiguedad para el docente
		IF EXISTS(SELECT * FROM Tb_Antiguedades WHERE idAgente = @AgenteV)
		BEGIN
			SELECT @HorasInformadas = DATEDIFF(HOUR, DATEADD(YEAR, -Anios, DATEADD(MONTH, -Meses, DATEADD(DAY, -Dias, Fechahasta))), FechaHasta),
			@FechaHastaDeAntiguedad = DATEADD(DAY, 1, FechaHasta)
			FROM Tb_Antiguedades WHERE idAgente = @AgenteV
		END
		--Si no existe fecha de antiguedad (es decir, no existe un registro de antiguedad)
		IF @FechaHastaDeAntiguedad IS NULL
			SELECT @FechaHastaDeAntiguedad = MIN(FechaAlta) FROM tb_ServiciosAgentes WHERE Agente = @AgenteV
		--Se calculan las horas que tiene dentro del sistema educativo
		EXEC paCalcularAntiguedadDelAgenteEnHoras @AgenteV, @FechaHastaDeAntiguedad, @Hasta, @HorasDelSistema OUTPUT
		--Pasamos todo a años
		SELECT @Anios = (@HorasInformadas + @HorasDelSistema) / 8766		
		-- Buscamos Dias Vacaciones 
		SELECT @DiasVacaciones = DiasVacaciones 
			FROM Tb_DiasDescansoAnual
			WHERE @Anios >=  AniosDesde AND @Anios < AniosHasta
		IF @DiasVacaciones IS NULL
			SELECT @DiasVacaciones = 0

		-- Buscamos Dias del Mes
		SELECT @DiasALiquidar=Dias FROM Tb_Meses WHERE IDMes=MONTH(@FechaBajaV)

		SELECT @TotalVacacionesNoGozadas = ((@UltimoSueldo*@DiasVacaciones)/ @DiasALiquidar)*1.0833 -----(100/12 meses)

		IF @TotalVacacionesNoGozadas >0
		    BEGIN

			DECLARE @PorcentajeDeSubsidio DECIMAL (18,4)
			DECLARE @TotalDeSubsidio DECIMAL (18,4)

			SELECT @Afiliacion = IdAfiliacion FROM Tb_Afiliaciones WHERE idAgente = @AgenteV
			SELECT @Horas= Horas, @SubOrganizacion = SubOrganizacion, @PorcentajeDeSubsidio = PorcentajeSubsidio FROM Tb_Plazas WHERE idPlaza = @PlazaV

			SELECT @TotalDeSubsidio = (@TotalVacacionesNoGozadas * @PorcentajeDeSubsidio / 100)

			----- Agregar Registro en Tb_RegistrodeLiquidaciones --  TB_REGISTRODELIQUIDACIONES

			----- Proporcional Vacaciones No Gozadas 
			INSERT INTO Tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista, DiasLiquidados, SubOrganizacion)
				VALUES (NULL, @Afiliacion, @AgenteV, NULL, 1, NULL, @ConceptoATotalizar, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, 0, @TotalVacacionesNoGozadas, @OrganizacionV, NULL, @ServicioV, @SituacionRevistaV, @DiasALiquidar, @SubOrganizacion)

			----- Sueldo Bruto
			IF NOT EXISTS(SELECT Concepto FROM Tb_RegistroDeLiquidaciones WHERE Liquidacion=@IdLiquidacionActual AND Servicio=@ServicioV AND Concepto=20)
				INSERT INTO Tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
				VALUES (NULL, @Afiliacion, @AgenteV, NULL, 1, NULL, 20, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, 0, @TotalVacacionesNoGozadas, @OrganizacionV, NULL, @ServicioV, @SituacionRevistaV, @DiasALiquidar, @SubOrganizacion)
			ELSE
				UPDATE Tb_RegistroDeLiquidaciones SET MontoHaberes = MontoHaberes + @TotalVacacionesNoGozadas WHERE Liquidacion=@IdLiquidacionActual AND Servicio=@ServicioV AND Concepto=20

			
	
			----- Porcentaje de Subsidios
			IF NOT EXISTS(SELECT Concepto FROM Tb_RegistroDeLiquidaciones WHERE Liquidacion=@IdLiquidacionActual AND Servicio=@ServicioV AND Concepto=22)
				INSERT INTO Tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
				VALUES (NULL, @Afiliacion, @AgenteV, NULL, 1, NULL, 22, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, 0, @PorcentajeDeSubsidio, @OrganizacionV, NULL, @ServicioV, @SituacionRevistaV, @DiasALiquidar, @SubOrganizacion)
	
	
			----  Total de Subsidio
			IF NOT EXISTS(SELECT Concepto FROM Tb_RegistroDeLiquidaciones WHERE Liquidacion=@IdLiquidacionActual AND Servicio=@ServicioV AND Concepto=24)
				INSERT INTO Tb_RegistroDeLiquidaciones (AfectadosPorAjuste, Afiliacion, Agente, Ajuste, Cantidad, Cargosalarial, Concepto, Descripcion, DescuentoExterno, Desde, Dias, Embargo, Hasta, Horas, LegajoSalarial, Liquidacion, MontoDescuento, MontoHaberes, Organizacion, Reclamado, Servicio, SituacionRevista,DiasLiquidados, SubOrganizacion)
				VALUES (NULL, @Afiliacion, @AgenteV, NULL, 1, NULL, 24, NULL, NULL, NULL, NULL, NULL, NULL, @Horas, 0, @IdLiquidacionActual, 0, @TotalDeSubsidio, @OrganizacionV, NULL, @ServicioV, @SituacionRevistaV, @DiasALiquidar, @SubOrganizacion)
			ELSE
				UPDATE Tb_RegistroDeLiquidaciones SET MontoHaberes = MontoHaberes + @TotalDeSubsidio WHERE Liquidacion=@IdLiquidacionActual AND Servicio=@ServicioV AND Concepto=24
			
			SELECT @NroError = @@ERROR
			
			IF @NroError <> 0
				 INSERT INTO tb_ErroresLiquidacion (Agente, Concepto, Diagnostico, Fecha, Liquidacion, Organizacion, Servicio, CabeceraDeLiquidacion, NumeroDeError) VALUES
				(@AgenteV, @ConceptoATotalizar, CONVERT(VARCHAR,@NroError), GETDATE(), @IdLiquidacionActual, @OrganizacionV, @ServicioV, @CabeceraDeLiquidacion, @NroError)

			PRINT 'Termino de Insertar ' + CONVERT(VARCHAR, @AgenteV)
   		   END 

	
		FETCH NEXT FROM ServiciosConVacaciones INTO @AgenteV, @ServicioV, @FechaAltaV, @FechaBajaV, @SituacionRevistaV, @OrganizacionV, @PlazaV
	END
	
CLOSE ServiciosConVacaciones
DEALLOCATE ServiciosConVacaciones
GO
